home *** CD-ROM | disk | FTP | other *** search
/ Libris Britannia 4 / science library(b).zip / science library(b) / DJGPP / GCC257S6.ZIP / src / gcc-257 / vmsconfi.com < prev    next >
Text File  |  1993-10-01  |  10KB  |  317 lines

  1. $ !
  2. $ !    Set up to compile GCC on VAX/VMS
  3. $ !
  4. $! Set the def dir to proper place for use in batch. Works for interactive too.
  5. $flnm = f$enviroment("PROCEDURE")     ! get current procedure name
  6. $set default 'f$parse(flnm,,,"DEVICE")''f$parse(flnm,,,"DIRECTORY")'
  7. $ !
  8. $set symbol/scope=(nolocal,noglobal)
  9. $ !
  10. $ echo = "write sys$output"
  11. $ !
  12. $ if f$search("config.h") .nes. "" then delete config.h.*
  13. $ copy [.config.vax]xm-vms.h []config.h
  14. $ echo "Linked `config.h' to `[.config.vax]xm-vms.h'.
  15. $ !
  16. $ if f$search("tconfig.h") .nes. "" then delete tconfig.h.*
  17. $ create []tconfig.h
  18. $DECK
  19. /* tconfig.h == config.h :: target and host configurations are the same */
  20. #include "config.h"
  21. $EOD
  22. $ echo "Created `tconfig.h'.
  23. $ !
  24. $ if f$search("hconfig.h") .nes. "" then delete hconfig.h.*
  25. $ create []hconfig.h
  26. $DECK
  27. /* hconfig.h == config.h :: host and target configurations are the same */
  28. #include "config.h"
  29. $EOD
  30. $ echo "Created `hconfig.h'.
  31. $ !
  32. $ if f$search("tm.h") .nes. "" then delete tm.h.*
  33. $!! copy [.config.vax]vms.h []tm.h
  34. $ edit/tpu/nojournal/nosection/nodisplay/command=sys$input -
  35.         [.config.vax]vms.h /output=[]tm.h
  36. $DECK
  37. !
  38. !  Copy file, changing lines of the form
  39. !    #include "vax/*"
  40. !  into
  41. !    #include "[.config.vax]*"
  42. !
  43.    file := CREATE_BUFFER("file", GET_INFO(COMMAND_LINE, "file_name"));
  44.    targ := LINE_BEGIN & '#include' & SPAN(ASCII(32)+ASCII(9)) & '"vax/';
  45.    rang := CREATE_RANGE(BEGINNING_OF(file), END_OF(file));
  46.    LOOP
  47.       incl := SEARCH_QUIETLY(targ, FORWARD, EXACT, rang);
  48.       EXITIF incl = 0;
  49.       POSITION(BEGINNING_OF(incl));
  50.       ERASE(incl);
  51.       COPY_TEXT('#include "[.config.vax]');
  52.       rang := CREATE_RANGE(END_OF(incl), END_OF(file));
  53.    ENDLOOP;
  54.    WRITE_FILE(file, GET_INFO(COMMAND_LINE, "output_file"));
  55.    QUIT
  56. $EOD
  57. $ echo "Generated `tm.h' from `[.config.vax]vms.h'.
  58. $ !
  59. $ if f$search("md.") .nes. "" then delete md..*
  60. $ copy [.config.vax]vax.md []md.
  61. $ echo "Linked `md' to `[.config.vax]vax.md'.
  62. $ !
  63. $ if f$search("aux-output.c") .nes. "" then delete aux-output.c.*
  64. $ copy [.config.vax]vax.c []aux-output.c
  65. $ echo "Linked `aux-output.c' to `[.config.vax]vax.c'.
  66. $ !
  67. $!
  68. $!
  69. $! Create the file version.opt, which helps identify the executable.
  70. $!
  71. $search version.c version_string,"="/match=and/output=t.tmp
  72. $open ifile$ t.tmp
  73. $read ifile$ line
  74. $close ifile$
  75. $delete t.tmp;
  76. $ijk=f$locate("""",line)+1
  77. $line=f$extract(ijk,f$length(line)-ijk,line)
  78. $ijk=f$locate("""",line)
  79. $line=f$extract(0,ijk,line)
  80. $ijk=f$locate("\n",line)
  81. $line=f$extract(0,ijk,line)
  82. $!
  83. $i=0
  84. $loop:
  85. $elm=f$element(i," ",line)
  86. $if elm.eqs."" then goto no_ident
  87. $if (elm.les."9").and.(elm.ges."0") then goto write_ident
  88. $i=i+1
  89. $goto loop
  90. $!
  91. $no_ident:
  92. $elm="?.??"
  93. $!
  94. $!
  95. $write_ident:
  96. $open ifile$ version.opt/write
  97. $write ifile$ "ident="+""""+elm+""""
  98. $close ifile$
  99. $purge version.opt
  100. $!
  101. $!
  102. $! create linker options files that lists all of the components for all
  103. $! possible compilers.  We do this by editing the file Makefile.in, and 
  104. $! generating the relevant files from it.
  105. $!
  106. $!
  107. $! Make a copy of the makefile if the sources are on a disk that is NFS 
  108. $!    mounted on a unix machine.
  109. $if f$search("Makefile.in").eqs."" .and. f$search("$M$akefile.in").nes."" -
  110.     then copy $M$akefile.in Makefile.in
  111. $!
  112. $!
  113. $echo "Now processing Makefile.in to generate linker option files."
  114. $edit/tpu/nojournal/nosection/nodisplay/command=sys$input
  115.    PROCEDURE generate_option_file (TAG_NAME, outfile)
  116.         position (beginning_of (newbuffer));
  117.         recursive_fetch_tag (TAG_NAME);
  118. !
  119. ! Now fix up a few things in the output buffer
  120. !
  121.     pat_replace ("bytecode "," ");
  122.     pat_replace (".o ",",");
  123.     pat_replace (".o","");  !appear at end of lines.
  124. !
  125. ! Remove trailing commas, if present.
  126. !
  127.     position (beginning_of (newbuffer));
  128.     LOOP
  129.       range1 := search_quietly("," & ((SPAN(" ") & LINE_END) | LINE_END),
  130.                    FORWARD, EXACT);
  131.       exitif range1 = 0;
  132.       position (beginning_of (range1));
  133.       erase(range1);
  134.       split_line;        
  135.       ENDLOOP;
  136. ! get rid of leading spaces on lines.
  137.         position (beginning_of (current_buffer)) ;
  138.     LOOP
  139.           range1 := search_quietly ( LINE_BEGIN & " ", FORWARD, EXACT) ;
  140.       EXITIF range1 = 0;
  141.       position (end_of (range1));
  142.       erase_character(1);
  143.     ENDLOOP;       
  144. !
  145. ! Now write the output file.
  146. !
  147.     SET(OUTPUT_FILE, newbuffer, outfile);
  148.       write_file (newbuffer);
  149.       erase (newbuffer);
  150.    ENDPROCEDURE;
  151.  
  152. !
  153. ! Looks up a tag, copies it to newbuffer, and then translates any $(...)
  154. ! definitions that appear.  The translation is put at the current point.
  155. !
  156.    PROCEDURE recursive_fetch_tag (TAG_N);
  157.    fetch_tag (TAG_N);
  158. !
  159. ! substitute any  makefile symbols $(...)
  160. !
  161.         position (beginning_of (current_buffer)) ;
  162.     LOOP
  163.       range1 := search_quietly ("$(" &  
  164.       SPAN("abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ#~0123456789")
  165.                     & ")", FORWARD, EXACT) ;
  166.       EXITIF range1 = 0;
  167.       position (beginning_of (range1));
  168.       move_horizontal(2);
  169.       mark_1 := MARK (NONE);
  170.       position (end_of (range1));
  171.       move_horizontal(-1);
  172.       mark_2 := MARK (NONE);
  173.       tag_range := CREATE_RANGE(MARK_1, MARK_2, NONE);
  174.       position (end_of (range1));
  175.       tag_string := STR (tag_range);
  176.       erase (range1);
  177.       fetch_tag (LINE_BEGIN & tag_string & ((SPAN(" ") & "=") | "="));
  178.           position (beginning_of (current_buffer)) ;
  179.     ENDLOOP;       
  180.    ENDPROCEDURE;
  181.  
  182. !
  183. ! Looks up the translation of a tag, and inserts it at the current location
  184. ! in the buffer
  185. !
  186.    PROCEDURE fetch_tag (TAG_N);
  187.       LOCAL mark1, mark2, mark3, range2;
  188.       mark3 := MARK(NONE) ;
  189.       position (beginning_of (mainbuffer)) ;
  190.       range2 := search_quietly (TAG_N, FORWARD, EXACT) ;
  191.       IF (range2 = 0) then 
  192.     position (mark3);
  193.     return;
  194.     endif;
  195.       position (end_of (range2)) ;
  196.       MOVE_HORIZONTAL(1);
  197.       mark1 := MARK(NONE) ;
  198.       position (beginning_of (range2)) ;
  199.       MOVE_VERTICAL(1);
  200.       MOVE_HORIZONTAL(-2);
  201.       LOOP
  202.     EXITIF CURRENT_CHARACTER <> "\" ;
  203.     ERASE_CHARACTER(1);
  204.     MOVE_HORIZONTAL(1);
  205.     MOVE_VERTICAL(1);
  206.     MOVE_HORIZONTAL(-2);
  207.     ENDLOOP;
  208.       MOVE_HORIZONTAL(1);
  209.       mark2 := MARK(NONE) ;
  210.       range2 := CREATE_RANGE(mark1, mark2, NONE) ;
  211.       position (mark3);
  212.       if (length(range2) = 0) then return; endif;
  213.       copy_text(range2);
  214.    ENDPROCEDURE;
  215.  
  216.    PROCEDURE pat_replace (
  217.       oldstring, !
  218.       newstring)  !
  219.       LOCAL range2;
  220.       position (beginning_of (current_buffer)) ;
  221.       LOOP
  222.          range2 := search_quietly (oldstring, FORWARD, EXACT) ;
  223.          EXITIF range2 = 0 ;
  224.          position (beginning_of (range2)) ;
  225.          erase (range2) ;
  226.          copy_text (newstring) ;
  227.          ENDLOOP ;
  228.    ENDPROCEDURE ;
  229.  
  230. ! this is the start of the main procedure
  231.    filename := GET_INFO (COMMAND_LINE, 'file_name') ;
  232.    mainbuffer := CREATE_BUFFER ("Makefile.in", "Makefile.in") ;
  233.    newbuffer := CREATE_BUFFER("outfile");
  234.    compiler_list := CREATE_BUFFER("compilers");
  235. !
  236. ! Add to this list, as required.  The file "Makefile.in" is searched for a
  237. ! tag that looks like "LINE_BEGIN + 'tag + (optional space) + "="".  The
  238. ! contents are assumed to be a list of object files, and from this list a
  239. ! VMS linker options file is generated.
  240. !
  241.    position (beginning_of (compiler_list));
  242.    recursive_fetch_tag(LINE_BEGIN & "COMPILERS" & ((SPAN(" ") & "=") | "="));
  243.    position (beginning_of (compiler_list));
  244.    LOOP ! kill leading spaces.
  245.     exitif current_character <> " ";
  246.     erase_character(1);
  247.     ENDLOOP;
  248.    position (beginning_of (compiler_list));
  249.       LOOP ! remove any double spaces.
  250.          range1 := search_quietly ("  ", FORWARD, EXACT) ; EXITIF range1 = 0 ;
  251.          position (beginning_of (range1)) ;
  252.          erase_character(1);
  253.          ENDLOOP ;
  254.    position (end_of (compiler_list));
  255.    move_horizontal(-1);
  256.    LOOP ! kill trailing spaces.
  257.     exitif current_character <> " ";
  258.     erase_character(1);
  259.     move_horizontal(-1);
  260.     ENDLOOP;
  261.    position (beginning_of (compiler_list));
  262.       LOOP
  263.          range1 := search_quietly (" ", FORWARD, EXACT) ;
  264.          EXITIF range1 = 0 ;
  265.          position (beginning_of (range1)) ;
  266.          erase (range1) ;
  267.      split_line;
  268.          ENDLOOP ;
  269. !
  270. ! We now have a list of supported compilers.  Now write it, and use it.
  271. !
  272.     SET(OUTPUT_FILE, compiler_list, "compilers.list");
  273.       write_file (compiler_list);
  274.    generate_option_file(LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="),
  275.             "independent.opt");
  276.    generate_option_file(LINE_BEGIN & "LIB2FUNCS" & ((SPAN(" ") & "=") | "="),
  277.             "libgcc2.list");
  278.    generate_option_file(LINE_BEGIN & "BC_ALL" & ((SPAN(" ") & "=") | "="),
  279.             "bc_all.opt");
  280.    generate_option_file(LINE_BEGIN & "BI_OBJ" & ((SPAN(" ") & "=") | "="),
  281.             "bi_all.opt");
  282. !
  283. ! Now change OBJS in the Makefile, so each language specific options file 
  284. ! does not pick up all of the language independent files.
  285. !
  286.    position (beginning_of (mainbuffer));
  287.    range1 := search_quietly (LINE_BEGIN & "OBJS" & ((SPAN(" ") & "=") | "="),
  288.                  FORWARD, EXACT) ;
  289.    position (end_of (range1));
  290.    split_line;
  291.    position (beginning_of (compiler_list));
  292.    LOOP
  293.      cmark := mark(NONE);
  294.      exitif cmark = end_of(compiler_list);
  295.      message(current_line);
  296.      generate_option_file(LINE_BEGIN & Current_line & ((SPAN(" ") & ":") | ":"),
  297.               current_line+"-objs.opt");
  298.      position (cmark);
  299.      move_vertical(1);
  300.    ENDLOOP ;
  301.    quit ;
  302. $ echo ""
  303. $!
  304. $! Remove excessive versions of the option files...
  305. $!
  306. $ purge *.opt
  307. $ purge compilers.list,libgcc2.list
  308. $!
  309. $!
  310. $!
  311. $ if f$search("config.status") .nes. "" then delete config.status.*
  312. $ open/write file config.status
  313. $ write file "Links are now set up for use with a vax running VMS."
  314. $ close file
  315. $ type config.status
  316. $ echo ""
  317.